package com.codegen.entity;

import com.baomidou.mybatisplus.annotation.Version;
import com.codegen.enums.FieldType;
import com.codegen.enums.FilterType;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;

/**
 * 非数据库库的扩展字段
 *
 * @author LZCXTECH06
 * @date 2019年9月9日
 */
@Data
public class Field {

    /**
     * 字段名（数据库字段名）
     */
    private String name;
    /**
     * 字段描述
     */
    private String desc;
    /**
     * 字段类型（数据库）
     */
    private String type;

    /**
     * 列表是否展示
     */
    private boolean listViewable;

    /**
     * 表单是否展示
     */
    private boolean formViewable;

    /**
     * 列表 可排序
     */
    private boolean sortable;

    /**
     * 列表展示顺序（如果有主键，主键默认第一个）
     */
    private Integer index;

    /**
     * 列表过滤配置(如果为空表示不进行过滤)
     *
     * @see com.codegen.enums.FilterType
     */
    private String filterType;

    /**
     * 是否必填（表单）
     */
    private boolean required;

    /**
     * 表单控件
     */
    private String widgetType;

    /**
     * 表单控件参数
     */
    private String widgetOpt;

    /**
     * 是否列表导出（这个需要在Table中支持导出才可以生效）
     */
    private boolean exportable;

    /**
     * 校验类型
     *
     * @see com.codegen.enums.ValidateType
     */
    private String validType;

    /**
     * 校验正则
     */
    private String regExp;

    /**
     * 最小长度
     */
    private int minLen;
    /**
     * 最大长度
     */
    private int maxLen;
    /**
     * 最小值
     */
    private double minVal;
    /**
     * 最大值
     */
    private double maxVal;

    /**
     * 字段关联表对应的字段
     */
    private TableRef ref;

    /**
     * 列名转换成Java属性名
     */
    @JsonIgnore
    public String getJavaFieldName() {
        return StringUtils.uncapitalize(WordUtils.capitalizeFully(getName(), new char[]{'_'}).replace("_", ""));
    }

    /**
     * 列转换成Java类型名
     */
    @JsonIgnore
    public String getJavaFieldType() {
        return WordUtils.capitalizeFully(getName(), new char[]{'_'}).replace("_", "") + "Enum";
    }

    /**
     * 列类型
     */
    @JsonIgnore
    public FieldType getFieldType() {
        return FieldType.valueOf(getType());
    }
}
